using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using EYDIngenieria.ERP.Aplicacion.Gestion;
using EYDIngenieria.ERP.Aplicacion.Mantenedores;
using EYDIngenieria.ERP.ObjetosDeNegocio.Dominio;
using EYDIngenieria.ERP.ObjetosDeNegocio.Repositorio;
using System.Windows.Forms;

public partial class Gestion_Cotizacion : System.Web.UI.Page
{
    private readonly MantenedorProveedor mantenedorProveedor = new MantenedorProveedor();
    private readonly MantenedorFamiliaProducto mantenedorFamiliaProducto = new MantenedorFamiliaProducto();
    private readonly MantenedorEstadoCotizacion mantenedorEstadoCotizacion = new MantenedorEstadoCotizacion();
    private readonly MantenedorProducto mantenedorProducto = new MantenedorProducto();
    private readonly GestionCotizacion gestionCotizacion = new GestionCotizacion();
    private readonly RepositorioDetalleCotizacion repositorioDetalleCotizacion = new RepositorioDetalleCotizacion();
    private readonly GestionOrdenDeCompra gestionOrdenDeCompra = new GestionOrdenDeCompra();
    private Proveedor[] proveedores;
    private FamiliaProducto[] familiasDeProducto;
    private Producto[] productos;
    private Cotizacion cotizacion = new Cotizacion();

    private ListItem _li = new ListItem("Seleccione", "0");
    protected void Page_Load(object sender, EventArgs e)
    {
 
        if (Session.Keys.Count == 0)
            Response.Redirect("../Default.aspx");
        if (!IsPostBack)
        {
            Session.Add("Cotizacion", cotizacion);
            ddlProveedor.DataTextField = "RazonSocial";
            ddlProveedor.DataValueField = "Id";
            proveedores = mantenedorProveedor.Listar();
            ddlProveedor.DataSource = proveedores;
            ddlProveedor.DataBind();

            ddlProveedor.Items.Insert(0, _li);

            ddlFamilia.DataTextField = "Nombre";
            ddlFamilia.DataValueField = "Id";
            familiasDeProducto = mantenedorFamiliaProducto.Listar();
            ddlFamilia.DataSource = familiasDeProducto;
            ddlFamilia.DataBind();
            ddlFamilia.Items.Insert(0, _li);

            ddlProducto.DataTextField = "Nombre";
            ddlProducto.DataValueField = "Id";
            ddlProducto.DataSource = productos;
            ddlProducto.DataBind();
            ddlProducto.Items.Insert(0, _li);

            lblFecha.Text = DateTime.Now.ToShortDateString();
            CargarListaOrdenes();
            Cotizacion[] cotizaciones = gestionCotizacion.Listar(mantenedorEstadoCotizacion.Buscar("C")[0]);
            if (cotizaciones.Length > 0)
                Session.Add("Cotizacion", cotizaciones[0]);
           
        }
     // CargaOrden();
        btnFinalizar.Enabled = GridView1.Rows.Count > 0;
    }

    private void CargarListaOrdenes()
    {
        lbxOrdenes.Items.Clear();
        Cotizacion[] cotizacionesCreadas = gestionCotizacion.Listar(mantenedorEstadoCotizacion.Buscar("C")[0]);
       // Cotizacion[] cotizacionesRechazadas = gestionCotizacion.Listar(mantenedorEstadoCotizacion.Buscar("R")[0]);

        ListItem l;
        foreach (Cotizacion c in cotizacionesCreadas)
        {
            l = new ListItem(string.Format("{0} - {1} - {2}", c.Id.ToString(), c.Proveedor.RazonSocial, c.Fecha.ToString("dd-MM-yyyy")), c.Id.ToString());
            lbxOrdenes.Items.Add(l);
        }

        //foreach (Cotizacion c in cotizacionesRechazadas)
        //{
        //    l = new ListItem(string.Format("{0} - {1} - {2}", c.Id.ToString(), c.Proveedor.RazonSocial, c.Fecha.ToString("dd-MM-yyyy")), c.Id.ToString());
        //    lbxOrdenes.Items.Add(l);
        //}

       
    }

    protected void btnAgregar_Click(object sender, EventArgs e)
    {
        DetalleCotizacion detalleCotizacion;
        cotizacion = ((Cotizacion)Session["Cotizacion"]);
        long montoTotal = 0;
        detalleCotizacion = new DetalleCotizacion();
        detalleCotizacion.Cantidad = long.Parse(txbCantidad.Text);
        detalleCotizacion.ValorTotal = detalleCotizacion.Cantidad * detalleCotizacion.ValorUnitario;
        detalleCotizacion.Producto = mantenedorProducto.Obtener(int.Parse(ddlProducto.SelectedValue)); 
        cotizacion.Detalle.Add(detalleCotizacion);
        if(cotizacion.Id>0)
        {
            gestionCotizacion.Modificar(cotizacion);
            CargarListaOrdenes();
        }
        else 
        {
            cotizacion.Fecha = DateTime.Now;
            //oc.NumeroOrdenDeCompra = int.Parse(txbNumeroOC.Text);
            cotizacion.Proveedor = mantenedorProveedor.Obtener(int.Parse(ddlProveedor.SelectedValue));
            cotizacion = gestionCotizacion.GuardarCotizacion(cotizacion);
            Session["Cotizacion"] = cotizacion;
            CargarListaOrdenes();
        }
            
         //txbValorUnitario.Text = string.Empty;
        txbCantidad.Text = string.Empty;
        btnFinalizar.Enabled = GridView1.Rows.Count > 0;
        ddlFamilia.SelectedIndex = 0;
        ddlProducto.SelectedIndex = 0;
        lbxOrdenes.SelectedValue = cotizacion.Id.ToString();
        CargaOrden();
    }

    protected void btnFinalizar_Click(object sender, EventArgs e)
    {
        cotizacion = ((Cotizacion)Session["Cotizacion"]);
        if (lbxOrdenes.SelectedIndex < 0)
        {
            cotizacion.Fecha = DateTime.Now;
            //oc.NumeroOrdenDeCompra = int.Parse(txbNumeroOC.Text);
            cotizacion.Proveedor = mantenedorProveedor.Obtener(int.Parse(ddlProveedor.SelectedValue));
            gestionCotizacion.GuardarCotizacion(cotizacion);

        }
        else
        {
            cotizacion.EstadoCotizacion = mantenedorEstadoCotizacion.Buscar("C")[0];
            gestionCotizacion.Modificar(cotizacion);
        }



        Limpiar();
        CargarListaOrdenes();
        btnFinalizar.Enabled = GridView1.Rows.Count > 0;
    }

    protected void btnNuevo_Click(object sender, EventArgs e)
    {
        Session["Cotizacion"] = new Cotizacion();
        Limpiar();
    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        if (lbxOrdenes.SelectedIndex<0)
            return;
        
        Cotizacion c = gestionCotizacion.Obtener(int.Parse(lbxOrdenes.SelectedValue.ToString()));
        gestionCotizacion.Eliminar(c);
        Limpiar();
        Session["Cotizacion"] = new Cotizacion();
        CargarListaOrdenes();
    }

    //protected void gdvDetalleOC_SelectedIndexChanged(object sender, EventArgs e)
    //{
    //    cotizacion = ((Cotizacion)Session["Cotizacion"]);
    //    cotizacion.Detalle.RemoveAt(GridView1.SelectedIndex);
    //    SeteaTotal(cotizacion);

    //    DetalleCotizacion dc = repositorioDetalleCotizacion.Obtener(int.Parse(GridView1.SelectedDataKey.ToString()));
    //}

    protected void ddlFamilia_SelectedIndexChanged(object sender, EventArgs e)
    {
        FamiliaProducto f = new FamiliaProducto();
        f.Id = Int16.Parse(((DropDownList)sender).SelectedValue);
        productos = mantenedorProducto.Listar(f);
        ListItem liProducto;
        ddlProducto.Items.Clear();
        ddlProducto.DataValueField = "Id";
        foreach (Producto producto in productos)
        {
            liProducto = new ListItem(producto.Codigo + "-" + producto.Nombre, producto.Id.ToString());
            ddlProducto.Items.Add(liProducto);
        }
        //ddlProducto.DataSource = productos;

        ddlProducto.Items.Insert(0, _li);
    }

    protected void ddlProducto_SelectedIndexChanged(object sender, EventArgs e)
    {

    }

    protected void lbxOrdenes_SelectedIndexChanged(object sender, EventArgs e)
    {
        cotizacion = gestionCotizacion.Obtener(int.Parse(lbxOrdenes.SelectedValue));
        ddlProveedor.SelectedValue = cotizacion.Proveedor.Id.ToString();
        CargaOrden();
        Session.Add("COTIZCAIONIMPRESION", cotizacion); 
    }

    private void SeteaTotal(Cotizacion cotizacion)
    {/*
        long montoTotal = 0;
        foreach (DetalleCotizacion d in cotizacion.Detalle)
        {
            montoTotal = montoTotal + d.ValorTotal;
        }
        ((Label)GridView1.FooterRow.FindControl("lblTotal")).Text = montoTotal.ToString();
      */
    }

    private void CargaOrden()
    {
        if (lbxOrdenes.SelectedIndex<0)
        {
            Session["Cotizacion"] = new Cotizacion();
            return;
        }
        Cotizacion oc = gestionCotizacion.Obtener(int.Parse(lbxOrdenes.SelectedValue.ToString()));
        lblFecha.Text = oc.Fecha.ToShortDateString();
        //txbNumeroOC.Text = oc.Id.ToString();
        //ddlProveedor.SelectedValue = oc.Proveedor.Id;
        //.Text = oc.MontoTotal.ToString();
        lblFecha.Text = oc.Fecha.ToShortDateString();
        SeteaTotal(oc);
        btnFinalizar.Enabled = true;
        Session["Cotizacion"] = oc;
        //GridView1.DataSource = cotizacion.Detalle;
        if (GridView1.EditIndex > 0)
            return;
        ObjectDataSource1.Select();
        GridView1.DataBind();
        
    }

    private void Limpiar()
    {
        lbxOrdenes.SelectedIndex = -1;
        txbCantidad.Text = string.Empty;
    }

    protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
    {

    }
    protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
        e.NewValues["Fecha"] = DateTime.Parse(e.NewValues["Fecha"].ToString());
        //e.NewValues["Cotizacion"] = e.NewValues["Fecha"]
        DetalleCotizacion detalle =  repositorioDetalleCotizacion.Obtener(int.Parse(e.NewValues["Id"].ToString()));
        detalle.ValorUnitario = long.Parse(e.NewValues["ValorUnitario"].ToString());
        detalle.Cantidad = long.Parse(e.NewValues["Cantidad"].ToString());
        e.Cancel = true;
        repositorioDetalleCotizacion.Modificar(detalle);
        CargaOrden();
        ((GridView) sender).SelectedIndex = -1;
        ((GridView) sender).EditIndex = -1;
    }


    protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
    {
        e.Cancel = true;
        cotizacion = ((Cotizacion)Session["Cotizacion"]);
        DetalleCotizacion c =repositorioDetalleCotizacion.Obtener(int.Parse(e.Keys["Id"].ToString()));
        repositorioDetalleCotizacion.Eliminar(c);
        //SeteaTotal(cotizacion);
        CargaOrden();
        ((GridView)sender).SelectedIndex = -1;
        ((GridView)sender).EditIndex = -1;

    }
    protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
    {

    }
    protected void btnCotizar_Click(object sender, EventArgs e)
    {
        Mail mail = new Mail();
        Cotizacion c = (Cotizacion)Session["Cotizacion"];
        mail.EnviarMail(c);
         
        MessageBox.Show("Cotizacion enviada por mail", "Caption", MessageBoxButtons.OK,MessageBoxIcon.Information, MessageBoxDefaultButton.Button1,MessageBoxOptions.ServiceNotification);
    }
    protected void btnEnviar_Click(object sender, EventArgs e)
    {
        Cotizacion c = (Cotizacion)Session["Cotizacion"];
        if (c.Id == 0 || c.Detalle.Count==0)
        {
            cvlMontos.ErrorMessage =
                "La cotizacion debe tener como minimo un producto.";
            cvlMontos.IsValid = false;
            return;
        }

        cvlMontos.IsValid = true;
        foreach (DetalleCotizacion dc in c.Detalle)
        {
            if (dc.Cantidad ==0 || dc.ValorUnitario==0)
            {
                cvlMontos.ErrorMessage = "Debe ingresar el valor unitario de todos los productos del listado.";
                cvlMontos.IsValid = false;
                return;
            }
        }
        
        OrdenDeCompra oc = new OrdenDeCompra();
        oc.Fecha = DateTime.Now;
        oc.Proveedor = c.Proveedor;
        oc.MontoTotal = c.MontoTotal;
        DetalleOrdenDeCompra doc;
        foreach (DetalleCotizacion dc in c.Detalle)
        {
            doc = new DetalleOrdenDeCompra();
            doc.Producto = dc.Producto;
            doc.Cantidad = dc.Cantidad;
            doc.ValorUnitario = dc.ValorUnitario;
            doc.ValorTotal = doc.Cantidad*doc.ValorUnitario;
            oc.Detalle.Add(doc);
        }
        
        gestionOrdenDeCompra.GuardarOrdenDeCompra(oc);
        gestionCotizacion.Eliminar(c);
        Limpiar();
        CargarListaOrdenes();
        MessageBox.Show("Orden creada correctamente", "Caption", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.ServiceNotification);
    }
}
